<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <script type="text/javascript">
    /*
      js的运行环境：单线程 + 事件队列

      宏任务：进入事件队列的任务（事件处理函数；定时函数；Ajax的回调函数）
      微任务：Promise/Object.abserve/MutationObserver
            微任务执行的时机：主线程结束后，宏任务执行之前

      主线程 -> 微任务 -> 宏任务

      宏任务的触发条件：1、主线程必须空闲；2、特定的任务必须满足条件
    */
    console.log(1)

    var p = new Promise (function (resolve, reject) {
      console.log(4)
      setTimeout(function () {
        console.log(5)
      }, 100)
      console.log(6)
      resolve(7)
    })
    
    p.then(function (ret) {
      console.log(ret)
    })

    setTimeout(function () {
      console.log(2)
    }, 0)

    console.log(3)
  </script>
</body>
</html>